package org.wm.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.wm.entity.vo.LoginUser;
import org.wm.response.PageResult;
import org.wm.response.ResponseResult;
import org.wm.utils.DateUtils;
import org.wm.utils.SecurityUtils;
import org.wm.utils.ServletUtils;
import org.wm.utils.StringUtils;

import java.beans.PropertyEditorSupport;
import java.util.Date;

/**
 * web层通用数据处理
 */
@Slf4j
public class BaseController {

    /**
     * 将前台传递过来的日期格式的字符串，自动转化为Date类型
     */
    @InitBinder
    public void initBinder(WebDataBinder binder) {
        // Date 类型转换
        binder.registerCustomEditor(Date.class, new PropertyEditorSupport() {
            @Override
            public void setAsText(String text) {
                setValue(DateUtils.parseDate(text));
            }
        });
    }

    /**
     * 【移除】不再需要 startPage() 方法。
     * Mybatis-Plus 的分页参数是直接创建 Page 对象传递的。
     */
    // protected void startPage() { ... }

    /**
     * 【新增】一个工具方法，用于从请求中方便地构建 Page 对象。
     * 这可以替代原来 startPage() 的功能，但用法不同。
     * @param <T> 实体类型
     * @return Page<T> 对象
     */
    protected <T> Page<T> getPage() {
        Integer pageNum = ServletUtils.getParameterToInt("current", 1);
        Integer pageSize = ServletUtils.getParameterToInt("pageSize", 10);
        return new Page<>(pageNum, pageSize);
    }



    /**
     * 【改造】响应请求分页数据。
     * 参数从 List<T> 变为 Page<T>，因为 Service 层将直接返回 Page 对象。
     */
    protected <T> PageResult<T> getDataTable(IPage<T> page) { // <-- 修正：接收更通用的 IPage 接口
        return PageResult.success(page.getRecords(), page.getTotal());
    }

    /**
     * 返回成功
     */
    public ResponseResult success()
    {
        return ResponseResult.success();
    }

    /**
     * 返回失败消息
     */
    public ResponseResult error()
    {
        return ResponseResult.error();
    }

    /**
     * 返回成功消息
     */
    public ResponseResult success(String message)
    {
        return ResponseResult.success(message);
    }

    /**
     * 返回失败消息
     */
    public ResponseResult error(String message)
    {
        return ResponseResult.error(message);
    }

    /**
     * 响应返回结果
     *
     * @param rows 影响行数
     * @return 操作结果
     */
    protected ResponseResult toAjax(int rows)
    {
        return rows > 0 ? ResponseResult.success() : ResponseResult.error();
    }

    /**
     * 响应返回结果
     *
     * @param result 结果
     * @return 操作结果
     */
    protected ResponseResult toAjax(boolean result)
    {
        return result ? success() : error();
    }

    /**
     * 页面跳转
     */
    public String redirect(String url)
    {
        return StringUtils.format("redirect:{}", url);
    }

    /**
     * 获取用户缓存信息
     */
    public LoginUser getLoginUser()
    {
        return SecurityUtils.getLoginUser();
    }

    /**
     * 获取登录用户id
     */
    public Long getUserId()
    {
        return getLoginUser().getUserId();
    }

    /**
     * 获取登录部门id
     */
    public Long getDeptId()
    {
        return getLoginUser().getDeptId();
    }

    /**
     * 获取登录用户名
     */
    public String getUsername()
    {
        return getLoginUser().getUsername();
    }
}